package com.pe.pgn.clubpgn.webapp.controller.estacion;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpbEstacion;
import com.pe.pgn.clubpgn.domain.ClpmUbigeo;
import com.pe.pgn.clubpgn.service.AfiliacionService;
import com.pe.pgn.clubpgn.service.ClienteEmpresaService;
import com.pe.pgn.clubpgn.service.EstacionService;
import com.pe.pgn.clubpgn.service.SincronizacionFlotaService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;

/**
 * @author Edwin Farfan
 */
@Controller
@RequestMapping("/estacion/**")
public class EstacionController extends BaseFormController{

	@Autowired
	private ClienteEmpresaService clienteEmpresaService;
	
	@Autowired
	private SincronizacionFlotaService sincronizacionService; 
	
	@Autowired
	private EstacionService service;
	
	@Autowired
	private AfiliacionService afiliacionService;
	
	@RequestMapping(value = "/estacionList.html")
    public void listarEstaciones(ModelMap model) {

		List<ClpbEstacion> listadoEstaciones = service.obtenerEstaciones();
		model.addAttribute("estaciones", listadoEstaciones);
    }
	
	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/estacionForm.html", method = RequestMethod.GET)
	public @ModelAttribute("estacion") ClpbEstacion verEstacion
	(@RequestParam(value = "id", required = false) Long id,ModelMap modelMap){
		
		List listDep = afiliacionService.findDepartamentosUbigeo(false);		
		ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
		
		List listProv = afiliacionService.findPronvinciaUbigeo(dep.getCoDepartamento().toString(), false);
		ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
		
		List listDist = afiliacionService.findDistritoUbigeo(dep.getCoDepartamento().toString(),prov.getCoProvincia().toString(), false);
	
		if (id != null) {
			ClpbEstacion estacion= service.obtenerEstacion(id);
			if(estacion.getClpmUbigeo()!=null){
				listDep  = afiliacionService.findDepartamentosUbigeo(false);				
				listProv = afiliacionService.findPronvinciaUbigeo(estacion.getCoDepartamento().toString(), false);				
				listDist = afiliacionService.findDistritoUbigeo(estacion.getCoDepartamento().toString(),estacion.getCoProvincia().toString(), false);
			}
			modelMap.addAttribute("listadepartamento"		, listDep);
			modelMap.addAttribute("listaprovincia"			, listProv);
			modelMap.addAttribute("listadistrito"			, listDist);
			return estacion;
		}
		modelMap.addAttribute("listadepartamento"		, listDep);
		modelMap.addAttribute("listaprovincia"			, listProv);
		modelMap.addAttribute("listadistrito"			, listDist);
		ClpbEstacion estacion = new ClpbEstacion();
		estacion.setStEstacion(Boolean.TRUE);
		return estacion;
	}
	

	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/estacionForm.html", method = RequestMethod.POST)
	public String guardarEstacion(@ModelAttribute("estacion") ClpbEstacion estacion,
			BindingResult result, SessionStatus status, HttpServletRequest request,ModelMap modelMap) {

		try {
			if (result.hasErrors()) {
	     		List listDep = afiliacionService.findDepartamentosUbigeo(false);		
        		ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
        		
        		List listProv = afiliacionService.findPronvinciaUbigeo(dep.getCoDepartamento().toString(), false);
        		ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
        		
        		List listDist = afiliacionService.findDistritoUbigeo(dep.getCoDepartamento().toString(),prov.getCoProvincia().toString(), false);
        		
        		modelMap.addAttribute("listadepartamento"		, listDep);
        		modelMap.addAttribute("listaprovincia"			, listProv);
        		modelMap.addAttribute("listadistrito"			, listDist);        		
        		modelMap.addAttribute("estacion", estacion);
				return "/estacion/estacionForm";
			}
			
			String coDepartamento = estacion.getCoDepartamento();
	        String coProvincia 	  = estacion.getCoProvincia();
	        String coDistrito 	  = estacion.getCoDistrito();	
			
	        ClpmUbigeo clpmUbigeo = afiliacionService.getUbigeo(coDepartamento,coProvincia,coDistrito);
        	estacion.setClpmUbigeo(clpmUbigeo);
        	
        	Integer validaNombre;
        	if (null!=estacion.getId()){
        		validaNombre = service.validaNombreEstacion(estacion.getId(), estacion.getDeEstacion());
        	} else {
        		validaNombre = service.validaNombreEstacion(new Long(0), estacion.getDeEstacion());
        	}
        	
        	if (validaNombre > 0){
        		
        		List listDep = afiliacionService.findDepartamentosUbigeo(false);		
        		ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
        		
        		List listProv = afiliacionService.findPronvinciaUbigeo(dep.getCoDepartamento().toString(), false);
        		ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
        		
        		List listDist = afiliacionService.findDistritoUbigeo(dep.getCoDepartamento().toString(),prov.getCoProvincia().toString(), false);
        		
        		modelMap.addAttribute("listadepartamento"		, listDep);
        		modelMap.addAttribute("listaprovincia"			, listProv);
        		modelMap.addAttribute("listadistrito"			, listDist);        		
        		
    			saveError(request, getText("estacionForm.error.repite.nombre", request.getLocale()));
    			return "/estacion/estacionForm";
        	}
        	
        	Integer validaCofide;
        	if (null!=estacion.getId()){
        		validaCofide= service.validaCodigoCofide(estacion.getId(), estacion.getCoCodigoCofide());
        	} else {
        		validaCofide= service.validaCodigoCofide(new Long(0), estacion.getCoCodigoCofide());
        	}
        	
        	if (validaCofide > 0){
        		
        		List listDep = afiliacionService.findDepartamentosUbigeo(false);		
        		ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
        		
        		List listProv = afiliacionService.findPronvinciaUbigeo(dep.getCoDepartamento().toString(), false);
        		ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
        		
        		List listDist = afiliacionService.findDistritoUbigeo(dep.getCoDepartamento().toString(),prov.getCoProvincia().toString(), false);
        		
        		modelMap.addAttribute("listadepartamento"		, listDep);
        		modelMap.addAttribute("listaprovincia"			, listProv);
        		modelMap.addAttribute("listadistrito"			, listDist);        		
        		
    			saveError(request, getText("estacionForm.error.repite.cofide", request.getLocale()));
    			return "/estacion/estacionForm";
        	}        	
        	
        	boolean isNew = false;
        	if(estacion.getId() == null)
        	isNew = true;
        	
			service.guardarEstacion(estacion);			
			Long idEstacion = estacion.getId();
			boolean stEstacion = estacion.isStEstacion();
			sincronizacionService.guardarSyncPorClientesEstacion(idEstacion,stEstacion,isNew);
			clienteEmpresaService.guardarClientesEmpresaEstacion(idEstacion,stEstacion,isNew);
			
			saveMessage(request, getText("estacionForm.added", estacion.getDeEstacion().length() > CLPConstantes.LIMITE_CADENA ?
			estacion.getDeEstacion().substring(0, CLPConstantes.LIMITE_CADENA).concat(CLPConstantes.PUNTOS_SUSPENSIVOS) : 
			estacion.getDeEstacion(),request.getLocale()));
			
			return "redirect:estacionList.html";
			
		} catch (Exception e) {
			System.out.println("Exception invisible "+e.getMessage());
			saveError(request, getText("errors.general", request.getLocale()));
     		List listDep = afiliacionService.findDepartamentosUbigeo(false);		
    		ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
    		
    		List listProv = afiliacionService.findPronvinciaUbigeo(dep.getCoDepartamento().toString(), false);
    		ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
    		
    		List listDist = afiliacionService.findDistritoUbigeo(dep.getCoDepartamento().toString(),prov.getCoProvincia().toString(), false);
    		
    		modelMap.addAttribute("listadepartamento"		, listDep);
    		modelMap.addAttribute("listaprovincia"			, listProv);
    		modelMap.addAttribute("listadistrito"			, listDist);        		
    		modelMap.addAttribute("estacion", estacion);			
			return "/estacion/estacionForm";
		}
	}	
	
	@RequestMapping(value = "/eliminarEstacion.html")
	public String eliminarEstacion(@RequestParam(value = "id", required = true) Long idEstacion, 
			HttpServletRequest request) {

	   	if (idEstacion == null){
        	throw new IllegalArgumentException("el Id de la Estacion es requerido ");
        }
		try {
			
			sincronizacionService.guardarSyncPorClientesEstacion(idEstacion,false,false);
			clienteEmpresaService.guardarClientesEmpresaEstacion(idEstacion,false,false);			
			service.eliminarEstacion(idEstacion);
			
			saveMessage(request, getText("estacionForm.deleted", request.getLocale()));
			return "redirect:estacionList.html";
			
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "/estacion/estacionForm";
		}
	}		
	
}
